package com.time.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.time.domain.User;
import com.time.service.UserService;
import com.time.util.SessionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;

/**
 * @author 曾翔
 * @Description 用户信息 controller
 * @since 2020-10-19
 */

@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * @param userId 用户名
     * @return 返回验证结果
     * @Description 异步请求验证用户名是否存在
     */
    @ResponseBody
    @GetMapping("/verification")
    public String verification(String userId) {
        User userExist = userService.getById(userId);

        if (userExist != null) {
            return "该用户名已经注册";
        } else {
            return "";
        }
    }

    /**
     * @param user 注册用户对象
     * @return 注册成功，请求转发至登录页面，否则请求转发至注册表单
     * @Description 注册用户
     */
    @PostMapping("/register")
    public String register(User user) {
        boolean addUser = userService.addUser(user);

        // 注册成功，请求转发至登录页面，否则请求转发至注册表单
        return JumpPage.registerJumpPage(addUser);
    }

    /**
     * @param session 登录成功，将登录用户存储值用户session中
     * @param model   否则登录失败信息
     * @param user    登录用户对象
     * @param url     拦截的url
     * @return 成功登录，根据用户类型请求转发至前台主页或后台主页，登录失败，请求转发至登录页面
     * @Description 用户登录
     */
    @PostMapping("/login")
    public String login(HttpSession session, Model model, User user, String url) {
        User loginResult = userService.login(user.getUserId(), user.getPassword());

        // 判断是否成功登录
        if (loginResult != null) {
            SessionUtils.setUserSession(session, loginResult);

            // 如果拦截url不为空，则跳转至原url
            if (url != null && !"".equals(url)) {
                return "redirect:" + url;
            }
            return userType(loginResult.getStatus());
        } else {
            model.addAttribute("loginError", "用户名或密码错误");
            return "redirect:/login.jsp";
        }
    }

    /**
     * @param type 用户类型
     * @return 普通用户请求转发至前台主页，管理员请求转发至后台主页
     * @Description 判断用户类型
     */
    public String userType(Integer type) {
        String result = "";     // 重定向页面

        if (type.equals(User.USER_TYPE_NORMAL)) {
            result = "redirect:/index";
        } else if (type.equals(User.USER_TYPE_ADMIN)) {
            result = "redirect:/manage/index";
        }

        return result;
    }

    /**
     * @param model 封装分页用户数据
     * @param page  当前页和每页显示数量
     * @return 请求转发至后台用户列表页面
     * @Description 分页查询用户数据给后台
     */
    @RequestMapping("/list")
    public String users(Model model, Page<User> page) {
        // 由于页面无法选择每页显示数据，所以默认每页显示8条留言数据
        page.setSize(5);
        Page<User> userPage = userService.page(page);

        model.addAttribute("userPage", userPage);
        model.addAttribute("totalPage", userPage.getPages());
        return "manage/user";
    }

    /**
     * @return 跳转至用户数据添加页面
     */
    @RequestMapping("/add_input")
    public String addInput() {
        return "manage/user-add";
    }

    /**
     * @param user 添加的用户对象
     * @return 根据添加结果，请求转发至相应页面
     * @Description 添加用户数据
     */
    @PostMapping("/add")
    public String add(User user) {
        boolean addUserResult = userService.addUser(user);

        // 根据添加结果，请求转发至相应页面
        return JumpPage.backJumpPage(addUserResult);
    }

    /**
     * @param model  封装回显的用户数据
     * @param userId 用户ID
     * @return 请求转发至用户更新页面
     * @Description 跳转至用户更新页面
     */
    @RequestMapping("/update_input")
    public String input(Model model, String userId) {
        User user = userService.getById(userId);

        model.addAttribute("user", user);
        return "manage/user-modify";
    }

    /**
     * @param user 更新的用户对象
     * @return 根据更新结果请求转发至相应页面
     * @Description 更新用户信息
     */
    @PostMapping("/update")
    public String update(User user) {
        boolean updateUser = userService.update(user);

        // 根据更新结果请求转发至相应页面
        return JumpPage.backJumpPage(updateUser);
    }

    /**
     * @param userId 用户ID
     * @return 根据删除结果请求转发至相应页面
     * @Description 根据用户ID删除用户信息
     */
    @RequestMapping("/delete")
    public String delete(String userId) {
        boolean deleteUser = userService.removeById(userId);

        // 根据删除结果请求转发至相应页面
        return JumpPage.backJumpPage(deleteUser);
    }
}